#include <stdio.h>

int main()
{
    int a = 10;  // 4字节
    char c = 20; // 1字节

    int *pa = &a;  // pa大小是8字节  目标元素是 int 的大小是4字节 步长4字节
    char *pc = &c; // pc大小是8字节  目标元素是 char 的大小是1字节 步长1字节

    printf("sizeof(pa) = %d\n", sizeof(pa));
    printf("sizeof(pc) = %d\n", sizeof(pc));

    printf("pa=%u  pa+1=%u\n", pa, pa + 1);
    printf("pc=%u  pc+1=%u\n", pc, pc + 1);

    // 指针运算  步长

    // 指针数组   指针元素组成的数组

    int x = 10;
    int y = 20;
    int z = 30;

    int *px = &x;
    int *py = &y;
    int *pz = &z;

    int *arr[3] = {px, py, pz}; // 指针组成的数组

    printf("%d\n", sizeof(arr));
    printf("%d\n", *(arr[1]));
    printf("%d\n", *(*(arr + 1)));

    int *(*pArr)[3] = &arr; // （指针元素组成的数组）数组的指针  =>  指针数组指针

    // 数组指针  数组的指针
    int arr1[5] = {1, 2, 3, 4, 5};

    printf("%u\n", arr1); // 数组的首地址
    int *p1 = arr1;
    printf("p1=%u  p1+1=%u\n", p1, p1 + 1);
    int (*p11)[5] = &arr1;
    printf("p11=%u  p11+1=%u\n", p11, p11 + 1);

    // 二维数组
    int arr2[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}};

    printf("%u\n", arr2); // 数组的首地址  arr2的首元素是  {1, 2, 3, 4} 这个数组

    int (*p2)[4] = arr2;
    printf("p2=%u  p2+1=%u\n", p2, p2 + 1);
    printf("arr2=%u  arr2+1=%u\n", arr2, arr2 + 1);
    printf("12============ %d\n", *(*(p2 + 2) + 3));

    int (*p22)[3][4] = &arr2;

    return 0;
}
